package main

import "fmt"

const (
	i=1<<iota
	j=3<<iota
	k
	l
)

func main() {
	const (
		a = iota   //0
		b          //1
		c          //2
		d = "ha"   //独立值，iota += 1
		e          //"ha"   iota += 1
		f = 100    //iota +=1
		g          //100  iota +=1
		h = iota   //7,恢复计数
		i          //8
	)
	// iota 是一个常量计数器，在 const 关键字出现时，其值被初始化为 0
	// 每遇到新的常量声明，其值加 1。
	// 即使前面的常量没有使用，iota 也会自动加 1。 一直到重新用iota赋值，才会重新计数。
	fmt.Println(a,b,c,d,e,f,g,h,i)

	fmt.Println("i=",i)
	fmt.Println("j=",j)
	fmt.Println("k=",k)
	fmt.Println("l=",l)

	//iota 只是在同一个 const 常量组内递增，
	// 每当有新的 const 关键字时
	// iota 计数会重新开始
	// 所以，iota 不能被修改，只能在 const 关键字出现时递增
	const (
		m = iota   //0
		n = iota   //1
		o = iota   //2
	)
	const mm = iota   //0
	const nn = iota   //0
	fmt.Println(m,n,o,mm,nn)

	const (
  	male = iota 
  	female = 666 // 这里被中断, 如果没有显示恢复, 那么下面没有赋值的常量都和上一行一样
  	yao
  )
  fmt.Println("male = ", male) // 0
  fmt.Println("male = ", female) // 666
  fmt.Println("male = ", yao) // 666


	// const (
  //   male float32 = iota // 显示指定类型,后续自增都会按照指定类型自增
  //   female
  //   yao
	// )
}
// 常量声明可以包含多个 iota 值，但它们必须在同一行。
// iota 可以被重新赋值，但不能被修改。